﻿using System;
using System.Drawing;
using System.Windows.Forms;
using AForge.Imaging.Filters;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using WindowsFormsGUI.Entidades;

namespace TestProject
{
    /// <summary>
    /// Summary description for UnitTest1
    /// </summary>
    [TestClass]
    public class EntrenarRNA
    {
        //[TestMethod]
        //public void AprenderMoneda25CCara()
        //{
        //    var pictureBox = new PictureBox();
        //    pictureBox.Load(@"D:\img\25cp_002.jpg");

        //    var bitmap = new Bitmap(pictureBox.Image);
        //    var imagenProcesada = ProcesadorDeImagen.ConvertirImagenAMapaDeBit(bitmap);
        //    var arreglo = ProcesadorDeImagen.ConvertirImagenEnArregloDeFloat(imagenProcesada);
                       
        //    var red = new HopfieldNetwork();
        //    red.Inicializar(arreglo.Length);
        //    red.Train(arreglo);

        //    ProcesadorDeImagen.Agregar(new ImageMonedaRecordada(arreglo, CaraSecaEnum.UnPesoCara));

        //    var moneda = ProcesadorDeImagen.Clasificar(pictureBox.Image);
            
        //    Assert.IsTrue(moneda.Denominacion == DenominacionEnum.UnPeso);
        //}

        //[TestMethod]
        //public void AprenderMoneda50CentavosCara()
        //{
        //    var pictureBox = new PictureBox();
        //    pictureBox.Load(@"D:\50c.jpg");

        //    var bitmap = new Bitmap(pictureBox.Image);
        //    var imagenProcesada = ProcesadorDeImagen.ConvertirImagenAMapaDeBit(bitmap);
        //    var arreglo = ProcesadorDeImagen.ConvertirImagenEnArregloDeFloat(imagenProcesada);

        //    var red = new HopfieldNetwork();
        //    red.Inicializar(arreglo.Length);
        //    red.Train(arreglo);

        //    ProcesadorDeImagen.Agregar(new ImageMonedaRecordada(arreglo, CaraSecaEnum.CincuentaCentavosCara));

        //    var moneda = ProcesadorDeImagen.Clasificar(pictureBox.Image);

        //    Assert.IsTrue(moneda.Denominacion == DenominacionEnum.CincuentaCentavos);
        //}

        //[TestMethod]
        //public void AprenderMoneda50CaraY25CaraYReconocer25Cara()
        //{
        //    var pictureBox1 = new PictureBox();
        //    pictureBox1.Load(@"D:\img\25cC.jpg");
            
        //    var bitmap = new Bitmap(pictureBox1.Image);
        //    var imagenProcesada = ProcesarImagen(bitmap);
        //    var arreglo = ProcesadorDeImagen.ConvertirImagenEnArregloDeFloat(imagenProcesada);

        //    ProcesadorDeImagen.InicializarRed(arreglo.Length);
        //    ProcesadorDeImagen.Red.Train(arreglo);
        //    ProcesadorDeImagen.Agregar(new ImageMonedaRecordada(arreglo, CaraSecaEnum.VeinticincoCentavosCara));

        //    pictureBox1.Load(@"D:\img\50cC.jpg");

        //    bitmap = new Bitmap(pictureBox1.Image);
        //    imagenProcesada = ProcesarImagen(bitmap);
        //    arreglo = ProcesadorDeImagen.ConvertirImagenEnArregloDeFloat(imagenProcesada);

        //    ProcesadorDeImagen.Red.Train(arreglo);
        //    ProcesadorDeImagen.Agregar(new ImageMonedaRecordada(arreglo, CaraSecaEnum.CincuentaCentavosCara));           

        //    pictureBox1.Load(@"D:\img\25cC02.jpg");
        //    var moneda1 = ProcesadorDeImagen.Clasificar(pictureBox1.Image);
        //    Assert.IsTrue(moneda1.Denominacion == DenominacionEnum.VeinticincoCentavos);           
        //}

        //[TestMethod]
        //public void CalcularDistanciaEntreMonedaDe50y25ParaMonedaDe25()
        //{
        //    var pictureBox1 = new PictureBox();

        //    pictureBox1.Load(@"D:\img\50A.jpg");
        //    var bitmap1 = new Bitmap(pictureBox1.Image);
        //    var imgProcesada1 = ProcesarImagen(bitmap1);
        //    var arreglo1 = ProcesadorDeImagen.ConvertirImagenEnArregloDeFloat(imgProcesada1);

        //    pictureBox1.Load(@"D:\img\25A.jpg");
        //    var bitmap2 = new Bitmap(pictureBox1.Image);
        //    var imgProcesada2 = ProcesarImagen(bitmap2);
        //    var arreglo2 = ProcesadorDeImagen.ConvertirImagenEnArregloDeFloat(imgProcesada2);

        //    pictureBox1.Load(@"D:\img\25cC02.jpg");
        //    var bitmap3 = new Bitmap(pictureBox1.Image);
        //    var imgProcesada3 = ProcesarImagen(bitmap3);
        //    var arreglo3 = ProcesadorDeImagen.ConvertirImagenEnArregloDeFloat(imgProcesada3);

        //    var d1 = CalcularDistanciaEuclidia(arreglo1, arreglo3);
        //    var d2 = CalcularDistanciaEuclidia(arreglo2, arreglo3);

        //    Assert.IsTrue(d1 > d2);
        //}

        //#region Soporte
        
        //private Bitmap ProcesarImagen(Bitmap bitmap)
        //{
        //    return ProcesarImagenConAngulo(bitmap, 0);
        //}

        //private Bitmap ProcesarImagenConAngulo(Bitmap bitmap, double angulo)
        //{
        //    var redimension = Redimensionar(bitmap);
        //    var gris = EscalaDeGrises(redimension);
        //    var rotar = Rotar(gris, angulo);
        //    var binarizacion = Binarizacion(rotar);

        //    return binarizacion;
        //}

        //private Bitmap Rotar(Bitmap bitmap, double angulo)
        //{
        //    // create filter - rotate for 30 degrees keeping original image size
        //    var filter = new RotateBilinear(angulo, true);
        //    // apply the filter
        //    return filter.Apply(bitmap);
        //}

        //private Bitmap EscalaDeGrises(Bitmap bitmap)
        //{
        //    var filtro = new Grayscale(0.2125, 0.7154, 0.0721);
        //    return filtro.Apply(bitmap);
        //}

        //public Bitmap Binarizacion(Bitmap bitmap)
        //{
        //    var filtro = new Threshold();
        //    return filtro.Apply(bitmap);
        //}

        //private Bitmap Redimensionar(Bitmap bitmap)
        //{
        //    var filtro = new ResizeNearestNeighbor(100, 100);
        //    return filtro.Apply(bitmap);
        //} 

        //private double CalcularDistanciaEuclidia(float[] monedaRecordada, float[] arreglo)
        //{
        //    double acumulador = 0;

        //    for (int i = 0; i < monedaRecordada.Length; i++)
        //    {
        //        acumulador += Math.Pow((monedaRecordada[i] - arreglo[i]), 2);
        //    }

        //    return Math.Sqrt(acumulador);
        //}
     
        //#endregion

        [TestMethod]
        public void ConvertirHexaStringToInt()
        {
            string hexString = "31";
            int num = Int32.Parse(hexString, System.Globalization.NumberStyles.HexNumber);            
            Assert.IsTrue(num == 7);
        }

        [TestMethod]
        public void ConvertirIntToByte()
        {
            int intValue = 7;
            byte[] intBytes = BitConverter.GetBytes(intValue);
            Array.Reverse(intBytes);
            byte[] result = intBytes;

            byte[] q = new byte[]{0,0,0,7};

            Assert.AreSame(result, q);
        }

        [TestMethod]
        public void ConvertirHexaToInt()
        {
            var datos = "7B";
            var entero = Utilidades.HexaStringToInt(datos);

            Assert.IsTrue(entero == 123);
        }
    }
}
